App({
  onLaunch: function () {
    // this.openBEL()
  },
  globalData: {
    level: 0, // 默认0 1是1.0 2是2.0
    isOpenBLE: false,
    Interval: null,
    hasConnect: false, // 是否已连接

    //-----------------------蓝牙id参数------------------------
    deviceId: null, //蓝牙id
    serviceId: null, //蓝牙服务id
    characteristicId: null, //蓝牙特征值id

    //-----------------------灯光修改参数------------------------
    code_0: 46, //帧头固定
    code_1: 10, //长度固定
    code_2: 0, //密码 暂不使用为0
    code_3: 0, //分区 0统一 1分区一 2分区二
    code_4: 1, //模式 0关闭 1单色常亮 2单色呼吸 3渐变 4爆闪 5律动
    code_5: 10, //亮度 1至10  默认10
    code_6: 255, //R值 红色
    code_7: 0, //G值 绿色
    code_8: 0, //B值 蓝色
    code_9: 50, //效验码  ps:文档说是前九位code相加，默认50也能用，具体怎么回事我也不知道

  },

  


  //全局调用写入蓝牙
  writeBLE(zone, light, module, R, G, B) { //分区参数
    let d = this.globalData;
    let code = [d.code_0, d.code_1, d.code_2, zone, module, light, R , G , B , d.code_9];
    let buffer = new ArrayBuffer(10);
    let dataView = new DataView(buffer);
    code.forEach((v, i) => dataView.setUint8(i, v))
    console.log(code);
    wx.writeBLECharacteristicValue({
      // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
      deviceId: d.deviceId,
      // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
      serviceId: d.serviceId,
      // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
      characteristicId: d.characteristicId,
      // 这里的value是ArrayBuffer类型
      value: buffer,
      success: (res) => {
        console.log('写入蓝牙成功', res.errMsg);
        // this.Toast('修改成功', 'success')
      },
      fali: (err) => {
        console.log('写入蓝牙失败', err);
        this.Toast('修改失败,请检查蓝牙是否打开！')
      }
    })
  },

  //启动蓝牙入口函数
  openBEL() {
    if (!this.globalData.isOpenBLE) {
      this.BLEInit();
      let Interval = setInterval(() => {
          this.BLEInit();
          console.log('重启蓝牙');
      }, 5000)
      this.globalData.Interval = Interval
    }
  },
  /****************1.蓝牙初始化***************/
  BLEInit() {
    const that = this;
    wx.openBluetoothAdapter({
      success: (res) => {
        clearInterval(that.globalData.Interval);
        this.BLEState()
      },
      fail: (res) => {
        this.Toast('请打开蓝牙和定位功能!')
      }
    })
  },
  /****************2.获取蓝牙状态***************/
  BLEState() {
    wx.getBluetoothAdapterState({
      success: (res) => {
        this.BLESearch()
      },
      fail: (res) => {
        this.Toast('蓝牙状态错误,请重新打开小程序')
      }
    })
  },
  /****************3.搜索附近蓝牙***************/
  BLESearch() {
    wx.startBluetoothDevicesDiscovery({
      // services: ["0000FE8F-0000-1000-8000-00805F9B34FB"], //蓝牙设备id
      success: (res) => {
        console.log('开始扫描附近设备!', res);
        this.BLEGetDevices()
      }
    });
  },
  /****************4.获取蓝牙设备***************/
  BLEGetDevices() {
    wx.getBluetoothDevices({
      success: (res) => {
        console.log('已经发现的所有蓝牙设备', res);
        let arr = [];
        res.devices.forEach(v => {
          console.log(v,123)
          if (v.name == 'BT201-BLE' || v.name == "MCFWD-YCA") {
            arr.push(v)
          }
        })
        if (arr.length) {
          console.log(arr,'氛围灯设备')
          this.BLEConnect(arr[0]);
          // wx.stopBluetoothDevicesDiscovery(); //  停止搜索蓝牙
        } else {
          wx.showLoading({
            title: '正在搜索蓝牙中，请稍后～',
            mask: true
          });
        }
      }
    })
    //发现蓝牙新设备事件
    wx.onBluetoothDeviceFound(res => {
      res.devices.forEach(v => {
        console.log('发现新设备', res);
        if (v.name == 'BT201-BLE' || v.name == "MCFWD-YCA") {
          if(!this.globalData.hasConnect){
            this.BLEConnect(v)
          }
          // wx.stopBluetoothDevicesDiscovery(); //  停止搜索蓝牙
        }
      })

    })
  },
  /****************5.链接蓝牙***************/
  BLEConnect(BLE) {
    wx.createBLEConnection({
      deviceId: BLE.deviceId,
      success: (res) => {
        this.globalData.hasConnect = true;
        clearInterval(this.globalData.Interval)
        console.log('链接成功=========》', res, BLE);
        this.Toast('连接成功～', 'success');
        wx.stopBluetoothDevicesDiscovery(); //  停止搜索蓝牙
        wx.onBLEConnectionStateChange((res) => {
          // 该方法回调中可以用于处理连接意外断开等异常情况
          if (!res.connected) {
            this.Toast('蓝牙已断开')
            this.globalData.deviceId = null; //蓝牙id
            this.globalData.serviceId = null; //蓝牙服务id
            this.globalData.characteristicId = null; //蓝牙特征值id
            wx.reLaunch({
              url: '/pages/link/link',
            })
            this.BLEGetDevices()
          }
          console.log(res)
        })
        this.BLEGetservice(BLE);
        this.globalData.deviceId = BLE.deviceId;
      },
      fail: (err) => {
        if (err.errCode == -1) {
          // errCode==-1 已链接蓝牙，重复链接失败
          return
        }
        this.Toast('连接失败!')
        console.log('链接失败原因', err);

      },
    })

  },
  /****************6.获取蓝牙服务***************/
  BLEGetservice(BLE) {
    wx.getBLEDeviceServices({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: BLE.deviceId,
      success: (res) => {
        console.log('获取蓝牙服务', res);
        this.BLEGetCharacteristics(BLE, res.services[0]);
        this.globalData.serviceId = res.services[0].uuid
      }
    })
  },
  /****************7.获取所有的特征值***************/
  BLEGetCharacteristics(BLE, SERVER) {
    wx.getBLEDeviceCharacteristics({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: BLE.deviceId,
      // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
      serviceId: SERVER.uuid,
      success: (res) => {
        console.log('获取所有的特征值', res)
        this.BLECharacteristicValueChange(BLE, SERVER, res.characteristics);
        this.globalData.characteristicId = res.characteristics[0].uuid
      }
    })
  },
  /****************8.启用特征值变化***************/
  BLECharacteristicValueChange(BLE, SERVER, CHARACTERISTIC) {
    wx.notifyBLECharacteristicValueChange({
      state: true,
      deviceId: BLE.deviceId,
      serviceId: SERVER.uuid,
      characteristicId: CHARACTERISTIC[0].uuid,
      success: (res) => {
        console.log('特征值发生变化', res)
        this.BLEDataRecieve(BLE, SERVER, CHARACTERISTIC)
      },
      fail: (err) => {
        console.log('启动notify失败:' + JSON.stringify(err));
      },
    })
  },
  /****************9.接收蓝牙的返回数据***************/
  BLEDataRecieve(BLE, SERVER, CHARACTERISTIC) {
    console.log('开始接受数据=>');
    wx.onBLECharacteristicValueChange((res) => {
      console.log('已经接受数据---------------------', res);
    })
  },

  //弹出提醒 
  Toast(title, icon = 'none', mask = true, duration = 1500) {
    wx.showToast({
      title,
      icon,
      duration,
      mask: false,
    });
  },
  
  // 校验和
  sum(arr) {
    return arr.reduce(function(prev, curr, idx, arr){
       return prev + curr;
     });
   },

})